﻿using System;
using System.Collections.Generic;
using Atendex.Dominio;
using Atendex.Dominio.ActiveRecord;
using Atendex.Dominio.Interfaces;
namespace Atendex.Containex
{
    public static class Container
    {
        public static IUnidadeNegocio CriarUnidadeNegocio(string nome, IResponsavel responsavel)        
        {
            return new UnidadeNegocioAR(nome, responsavel);
        }

        public static IAnexo CriarAnexo(string nome, byte[] dados)
        {
            return new AnexoAR(nome, dados);
        }

        public static IAnexo CriarAnexo(string nome, System.IO.Stream stream)
        {
            return new AnexoAR(nome, stream);
        }

        public static ICurso CriarCurso(string nome, List<IResponsavel> responsaveis)
        {
            return new CursoAR(nome, responsaveis);
        }

        public static IResponsavel CriarResponsavel(string nome, string email)
        {
            return new ResponsavelAR(nome, email);
        }

        public static IAtendente CriarAtendente(string nome, string email, string login, string senha)
        {
            return new AtendenteAR(nome, email, login, senha);
        }

        public static IMeio CriarMeioContato(string nome)
        {
            return new MeioAR(nome);
        }

        public static IAtendimento CriarAtendimento(IAtendente atendente)
        {
            return new AtendimentoAR(atendente);
        }

        public static IMensagem CriarMensagem(string texto)
        {
            return new MensagemAR(texto);
        }
        /// <summary>
        /// Cria um novo requerente.
        /// </summary>
        /// <param name="nome">o nome do requerente</param>
        /// <param name="meioContato">o meio de contato</param>
        /// <returns></returns>
        public static ISolicitante CriarSolicitante(string nome, IMeio meioContato)
        {
            return new SolicitanteAR(nome, meioContato);
        }
        /// <summary>
        /// Cria uma solicitação com uma mensagem inicial.
        /// </summary>
        /// <param name="atendimento">o atendimento ao qual a solicitação pertence</param>
        /// <param name="mensagem">a mensagem incial</param>
        /// <returns></returns>
        public static IOrdemServico CriarOrdemServico(IAtendimento atendimento, ITipoSolicitacao tipo, IMensagem mensagem)
        {
            return new OrdemServicoAR(atendimento, tipo, mensagem);
        }
        /// <summary>
        /// Cria uma solicitação com uma lista de mensagens iniciais.
        /// </summary>
        /// <param name="atendimento">o antendimento ao qual a solicitação pertence</param>
        /// <param name="mensagens">as mensagens iniciais</param>
        /// <returns></returns>
        public static IOrdemServico CriarOrdemServico(IAtendimento atendimento, ITipoSolicitacao tipo, IList<IMensagem> mensagens)
        {
            return new OrdemServicoAR(atendimento,tipo, mensagens);
        }
        /// <summary>
        /// Cria um tipo de solicitação.
        /// </summary>
        /// <param name="nome">nome do tipo</param>
        /// <param name="descricao">descricao do tipo</param>
        /// <param name="areaNegocio">a área de negócio associada ao tipo</param>
        /// <returns></returns>
        public static ITipoSolicitacaoAN CriarTipoSolicitacaoAN(string nome, string descricao, IUnidadeNegocio areaNegocio)
        {
            return new TipoSolicitacaoANAR(nome, descricao, areaNegocio);
        }

        public static ITipoSolicitacaoCurso CriarTipoSolicitacaoCurso(string nome, string descricao)
        {
            return new TipoSolicitacaoCursoAR(nome, descricao);
        }

        public static ITipoSolicitante CriarTipoSolicitante(string nome)
        {
            return new TipoSolicitanteAR(nome);
        }

        public static IGerente CriaGerente(string nome, string email, string login, string senha)
        {
            return new GerenteAR(nome, email, login, senha);

        }


    }
}
